"""
简历解析工具 - 使用专业工具将简历转换为高质量 Markdown 格式

使用策略：
- PDF 文件：使用 pymupdf4llm（专为 LLM 优化的 PDF 转 Markdown）
- 其他格式：使用 markitdown（微软的通用文档转 Markdown 工具）
"""

import os
import tempfile
from fastapi import UploadFile, HTTPException, status

# 导入文档转换工具
try:
    import pymupdf4llm  # PDF 转 Markdown（专为 LLM 优化）  # type: ignore

    PDF_CONVERTER_AVAILABLE = True
except ImportError:
    PDF_CONVERTER_AVAILABLE = False

try:
    from markitdown import MarkItDown  # 通用文档转 Markdown  # type: ignore

    MARKITDOWN_AVAILABLE = True
except ImportError:
    MARKITDOWN_AVAILABLE = False


class ResumeParser:
    """简历解析器 - 支持多种文件格式，输出高质量 Markdown"""

    # 支持的文件格式
    SUPPORTED_FORMATS = {
        "application/pdf": ".pdf",
        "application/vnd.openxmlformats-officedocument.wordprocessingml.document": ".docx",
        "application/msword": ".doc",
        "text/plain": ".txt",
        "text/markdown": ".md",
        "application/rtf": ".rtf",
    }

    @classmethod
    async def parse_resume(cls, file: UploadFile) -> str:
        """
        解析上传的简历文件，转换为高质量 Markdown 格式

        Args:
            file: FastAPI UploadFile 对象

        Returns:
            str: Markdown 格式的简历内容

        Raises:
            HTTPException: 文件格式不支持或解析失败时抛出异常
        """
        # 验证文件格式
        if file.content_type not in cls.SUPPORTED_FORMATS:
            raise HTTPException(
                status_code=status.HTTP_400_BAD_REQUEST,
                detail=f"不支持的文件格式: {file.content_type}。"
                f"支持的格式: {', '.join(cls.SUPPORTED_FORMATS.values())}",
            )

        # 验证文件大小（限制为 10MB）
        content = await file.read()
        file_size = len(content)
        max_size = 10 * 1024 * 1024  # 10MB

        if file_size > max_size:
            raise HTTPException(
                status_code=status.HTTP_400_BAD_REQUEST,
                detail=f"文件大小超过限制（最大 10MB），当前文件大小: {file_size / 1024 / 1024:.2f}MB",
            )

        # 创建临时文件进行解析
        try:
            # 获取文件扩展名
            file_extension = cls.SUPPORTED_FORMATS.get(file.content_type, ".txt")

            # 创建临时文件
            with tempfile.NamedTemporaryFile(
                delete=False, suffix=file_extension
            ) as temp_file:
                temp_file.write(content)
                temp_file_path = temp_file.name

            try:
                # 根据文件类型选择最佳转换工具
                if file.content_type == "application/pdf":
                    markdown_content = cls._parse_pdf(temp_file_path)
                else:
                    markdown_content = cls._parse_other(temp_file_path)

                # 验证解析结果
                if not markdown_content.strip():
                    raise HTTPException(
                        status_code=status.HTTP_400_BAD_REQUEST,
                        detail="无法从文件中提取有效内容，请检查文件是否损坏或为空",
                    )

                return markdown_content.strip()

            finally:
                # 清理临时文件
                if os.path.exists(temp_file_path):
                    os.unlink(temp_file_path)

        except HTTPException:
            # 重新抛出 HTTP 异常
            raise
        except Exception as e:
            # 捕获其他异常
            raise HTTPException(
                status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
                detail=f"简历解析失败: {str(e)}",
            )

    @classmethod
    def _parse_pdf(cls, file_path: str) -> str:
        """
        使用 pymupdf4llm 解析 PDF 文件为 Markdown

        Args:
            file_path: PDF 文件路径

        Returns:
            str: Markdown 格式内容
        """
        if not PDF_CONVERTER_AVAILABLE:
            raise ImportError("pymupdf4llm 未安装，请运行: pip install pymupdf4llm")

        try:
            # 使用 pymupdf4llm 转换 PDF 为 Markdown
            # 这个库专门为 LLM 优化，保留文档结构和格式
            markdown_content = pymupdf4llm.to_markdown(file_path)
            return markdown_content
        except Exception as e:
            raise Exception(f"PDF 解析失败: {str(e)}")

    @classmethod
    def _parse_other(cls, file_path: str) -> str:
        """
        使用 markitdown 解析其他格式文件为 Markdown

        Args:
            file_path: 文件路径

        Returns:
            str: Markdown 格式内容
        """
        if not MARKITDOWN_AVAILABLE:
            raise ImportError("markitdown 未安装，请运行: pip install markitdown")

        try:
            # 使用 markitdown 转换
            md_converter = MarkItDown()
            result = md_converter.convert(file_path)
            return result.text_content
        except Exception as e:
            raise Exception(f"文档解析失败: {str(e)}")

    @classmethod
    def get_supported_formats_list(cls) -> list:
        """
        获取支持的文件格式列表

        Returns:
            list: 支持的文件扩展名列表
        """
        return list(cls.SUPPORTED_FORMATS.values())
